<?php
/**
 * 绮梦PHP框架 (Dream PHP Freamework)
 * 免费 简单 快速 高效 安全 专业
 * 绮梦PHP框架是一个基于组件的PHP框架，用于快速开发现代Web应用程序。
 *
 * @author lewis (lewisld@163.com)
 * @copyright Copyright (c) 2015, lewis (http://www.dreamfreamework.com/)
 * @license http://www.dreamfreamework.com/licenses/ Apache License
 * @link http://www.dreamfreamework.com/
 */

namespace System\Caching;

use System\Caching\CacheInterface;
use System\Caching\AdapterInterface;
use System\Caching\Exception\AdapterNotSetException;

/**
 * 缓存类
 *
 * @package Dream
 * @subpackage Cache
 * @namespace System\Caching
 * @author lewis (lewisld@yeah.net)
 * @link http://www.dreamframework.com/doc/api/system/caching/Cache
 */
class Cache implements CacheInterface
{

    /**
     * 缓存驱动适配器
     *
     * @access protected
     * @var \System\Caching\AdapterInterface
     */
    protected $adapter = null;

    /**
     * 构造方法
     *
     * @param \System\Caching\AdapterInterface $adapter 缓存驱动适配器对象
     * @param array $adapter 设置缓存驱动适配器配置
     * @return void 没有返回值
     */
    public function __construct(AdapterInterface $adapter = null, $option = [])
    {
        if ($adapter) {
            $this->setAdapter($adapter);
        }
        if ([] !== $option) {
            foreach ($option as $key => $value) {
                $this->setOption($key, $value);
            }
        }
    }

    /**
     * 获取缓存
     *
     * @param string $key 缓存键名
     * @return mixed 返回缓存数据
     */
    public function get($key)
    {
        return $this->getAdapter()->get($key);
    }

    /**
     * 设置缓存
     *
     * @param string $key 缓存键名
     * @param mixed $value 缓存数据
     * @param int $expiry 缓存有效期
     * @return \System\Caching\Cache 返回当前对象
     */
    public function set($key, $value, $expiry = 0)
    {
        $this->getAdapter()->set($key, $value, $expiry);
        return $this;
    }

    /**
     * 删除缓存
     *
     * @param string $key 缓存键名
     * @return \System\Caching\Cache 返回当前对象
     */
    public function del($key)
    {
        $this->getAdapter()->del($key);
        return $this;
    }

    /**
     * 缓存是否存在
     *
     * @param string $key 缓存键名
     * @return bool 如果缓存已经存在就返回“true”，否则返回“false”
     */
    public function has($key)
    {
        return $this->getAdapter()->has($key);
    }

    /**
     * 设置缓存驱动适配器配置
     *
     * @param string $key 键名
     * @param string $value 值
     * @return \System\Caching\Cache 返回当前对象
     */
    public function setOption($key, $value)
    {
        $this->getAdapter()->setOption($key, $value);
        return $this;
    }

    /**
     * 清洗所有缓存
     *
     * @return \System\Caching\Cache 返回当前对象
     */
    public function clear()
    {
        $this->getAdapter()->clear();
        return $this;
    }

    /**
     * 清除所有过期的缓存
     *
     * @return \System\Caching\Cache 返回当前对象
     */
    public function drop()
    {
        $this->getAdapter()->drop();
        return $this;
    }

    /**
     * 获取驱动适配器对象
     *
     * @throws \System\Caching\Exception\AdapterNotSetException 缓存驱动适配器为设置异常
     * @return \System\Caching\AdapterInterface 返回驱动适配器对象
     */
    public function getAdapter()
    {
        if (! $this->adapter) {
            throw new AdapterNotSetException([
                'system.cache.adapetr.not.set'
            ]);
        }
        return $this->adapter;
    }

    /**
     * 设置驱动适配器对象
     *
     * @param \System\Caching\AdapterInterface $adapter 驱动适配器对象
     * @return \System\Caching\Cache 返回当前对象
     */
    public function setAdapter(AdapterInterface $adapter)
    {
        $this->adapter = $adapter;
        return $this;
    }
}
